import { SessionStorage } from './session-storage';
import { BrowserService } from './browser.service';
import { Injectable } from '@angular/core';
import { Utils } from 'web-module-shared';

export interface WeixinConfig {
    debug: boolean,
    appId: string,
    timestamp: number,
    nonceStr: string,
    signature: string,
    jsApiList: Array<string>
}

declare var wx: {
    cambioInit,
    config,
    ready,
    error,
    onMenuShareTimeline,
    onMenuShareAppMessage,
    onMenuShareQQ,
    onMenuShareWeibo,
    chooseWXPay,
    hideMenuItems,
    hideAllNonBaseMenuItem
}

@Injectable()
export class WeiXinService {

    weChatResource: any;
    private config: WeixinConfig;

    constructor(private browserService: BrowserService) { }

    /**
	 * 获取微信内的openid, 已经过期了
	 * @param redirect_uri
	 * @returns {*}
	 */
    getOpenid(redirect_uri, appId) {
        return new Promise((resolve, reject) => {
            if (!this.browserService.isWeixin()) {
                reject();
            } else {
                SessionStorage.setItem('redirect_uri', encodeURIComponent(redirect_uri));
                if (SessionStorage.getItem('openid')) {
                    resolve(SessionStorage.getItem('openid'));
                } else {
                    const code = SessionStorage.getItem('code');
                    if (Utils.isNotEmpty(code)) {
                        this.weChatResource.webCustomAccessToken({}, (o) => {
                            if (o.openid) {
                                SessionStorage.setItem('openid', o.openid);
                                SessionStorage.setItem('code', null);
                                resolve(o);
                            } else {
                                console.error(' CODE = ' + code + ' 请重新通过二维码扫描进入，没有openid = ' + JSON.stringify(o));
                            }
                        });
                    } else {
                        this.oauth2('snsapi_base', appId);
                    }
                }
            }
        })
    };

    setConfig(config: WeixinConfig) {
        this.config = config;
    }

    /**
	 * 获取用户的信息id
	 * @param redirect_uri
	 * @returns {d.promise|Function}
	 */
    getUser(redirect_uri, appId, appSecret) {
        return new Promise((resolve, reject) => {
            if (!this.browserService.isWeixin()) {
                reject();
            } else {
                SessionStorage.setItem('redirect_uri', encodeURIComponent(redirect_uri));
                if (SessionStorage.getItem('welcomeData')) {
                    resolve(SessionStorage.getItem('welcomeData'));
                } else {
                    const code = SessionStorage.getItem('code');
                    if (Utils.isNotEmpty(code)) {
                        this.weChatResource.getUser({
                            code: code,
                            appId: appId,
                            appSecret: appSecret
                        }, (o) => {
                            if (o.weChatUserId) {
                                SessionStorage.setItem('welcomeData', o);
                                SessionStorage.setItem('code', null);
                                resolve(o);
                            } else {
                                console.error(' CODE = ' + code + ' 请重新通过二维码扫描进入，没有openid = ' + JSON.stringify(o));
                            }
                        });
                    } else {
                        this.oauth2('snsapi_base', appId);
                    }
                }
            }
        });
    };

    getUserInfo(redirect_uri, className, appId, appSecret) {
        return new Promise((resolve, reject) => {
            if (!this.browserService.isWeixin()) {
                reject();
            } else {
                SessionStorage.setItem('redirect_uri', encodeURIComponent(redirect_uri));
                if (SessionStorage.getItem('welcomeData')) {
                    resolve(SessionStorage.getItem('welcomeData'));
                } else {
                    const code = SessionStorage.getItem('code');
                    if (Utils.isNotEmpty(code)) {
                        this.weChatResource.getUserInfo({
                            code: code,
                            appId: appId,
                            appSecret: appSecret
                        }, (o) => {
                            if (o.weChatUserId) {
                                SessionStorage.setItem('welcomeData', o);
                                SessionStorage.setItem('code', null);
                                resolve(o);
                            } else {
                                console.error(' CODE = ' + code + ' 请重新通过二维码扫描进入，没有openid = ' + JSON.stringify(o));
                            }
                        });
                    } else {
                        this.oauth2('snsapi_userinfo', appId);
                    }
                }
            }
        });
    };

	/**
	 * 返回已经匹配好的wx
	 * @returns {d.promise|Function}
	 */
    getJSSDK() {
        return new Promise((resolve, reject) => {
            if (typeof wx !== 'object') {
                throw new Error('微信对象为null');
            }
            if (this.config === undefined) {
                throw new Error('没有设置config');
            }
            const url = location.href.split('#')[0];
            wx.config({
                debug: this.config.debug,
                appId: this.config.appId,
                timestamp: this.config.timestamp,
                nonceStr: this.config.nonceStr,
                signature: this.config.signature,
                jsApiList: this.config.jsApiList
            });
            wx.ready(function () {
                resolve(wx);
            });
            wx.error(function (res) {
                // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
                console.error('wx.config error : ' + JSON.stringify(res));
            });
        });
    };

	/**
	 * 微信分享借口调用
	 * @param weiXinObj
	 * {
     *      menuShareTimeline:null,
     *      menuShareAppMessage:null,
     *      menuShareQQ:null,
     *      menuShareWeibo:null,
     * }
	 */
    weiXinInit(weiXinObj) {
        const that = this;

        if (typeof wx !== 'object') {
            throw new Error('微信对象为null');
        }
        if (this.config === undefined) {
            throw new Error('没有设置config');
        }
        wx.config({
            debug: this.config.debug,
            appId: this.config.appId,
            timestamp: this.config.timestamp,
            nonceStr: this.config.nonceStr,
            signature: this.config.signature,
            jsApiList: this.config.jsApiList
        });
        wx.ready(function () {
            /**
             * {
             *       title: '我居然是一个暖男',
             *       link: 'www.baidu.com', // 分享链接
             *       imgUrl: 'images/result_male_100.png', // 分享图标
             *       success: function () {
             *           // 用户确认分享后执行的回调函数
             *       },
             *       cancel: function () {
             *           // 用户取消分享后执行的回调函数
             *       }
             *  }
             */
            if (typeof weiXinObj.menuShareTimeline === 'object') {
                wx.onMenuShareTimeline(weiXinObj.menuShareTimeline);
            }

            /**
             * {
             *   title: '我居然是一个暖男', // 分享标题
             *   desc: '喜欢聊天，做事得体、分寸感强，陶醉于自己的容貌，起居方面清洁干净，比较文静，喜欢艺术和文学，渴望得到他人的赞许。', // 分享描述
             *   link: 'www.baidu.com', // 分享链接
             *   imgUrl: $scope.SkinPlugin + '/img/result_male_100.png', // 分享图标
             *   type: '', // 分享类型,music、video或link，不填默认为link
             *   dataUrl: '', // 如果type是music或video，则要提供数据链接，默认为空
             *   success: function () {
             *       // 用户确认分享后执行的回调函数
             *   },
             *   cancel: function () {
             *       // 用户取消分享后执行的回调函数
             *   }
             *   }
             */
            if (typeof weiXinObj.menuShareAppMessage === 'object') {
                wx.onMenuShareAppMessage(weiXinObj.menuShareAppMessage);
            }

            /**
             * {
             *   title: '我居然是一个暖男', // 分享标题
             *   desc: '喜欢聊天，做事得体、分寸感强，陶醉于自己的容貌，起居方面清洁干净，比较文静，喜欢艺术和文学，渴望得到他人的赞许。', // 分享描述
             *   link: 'www.baidu.com', // 分享链接
             *   imgUrl: $scope.SkinPlugin + '/img/result_male_100.png', // 分享图标
             *   success: function () {
             *       // 用户确认分享后执行的回调函数
             *   },
             *   cancel: function () {
             *       // 用户取消分享后执行的回调函数
             *   }
             *   }
             */
            if (typeof weiXinObj.menuShareQQ === 'object') {
                wx.onMenuShareQQ(weiXinObj.menuShareQQ);
            }

            /**
             * {
             *   title: '我居然是一个暖男', // 分享标题
             *   desc: '喜欢聊天，做事得体、分寸感强，陶醉于自己的容貌，起居方面清洁干净，比较文静，喜欢艺术和文学，渴望得到他人的赞许。', // 分享描述
             *   link: 'www.baidu.com', // 分享链接
             *   imgUrl: $scope.SkinPlugin + '/img/result_male_100.png', // 分享图标
             *   success: function () {
             *       // 用户确认分享后执行的回调函数
             *   },
             *   cancel: function () {
             *       // 用户取消分享后执行的回调函数
             *   }
             *   }
             */
            if (typeof weiXinObj.weiXinObjmenuShareWeibo === 'object') {
                wx.onMenuShareWeibo(weiXinObj.menuShareWeibo);
            }

            if (typeof weiXinObj.chooseWXPay === 'object') {
                wx.chooseWXPay(weiXinObj.chooseWXPay);
            }
        });

        wx.error(function (res) {
            console.error('wx.error: ', res);
        });
    };

    hideMenuItems(list) {
        if (typeof wx === 'object' && list instanceof Array) {
            wx.hideMenuItems({
                menuList: list // 要隐藏的菜单项，只能隐藏“传播类”和“保护类”按钮，所有menu项见附录3
            });
        }
    };

    hideAllNonBaseMenuItem() {
        if (typeof wx === 'object') {
            wx.hideAllNonBaseMenuItem();
        }
    };

	/**
	 * 打开微信授权页面
	 * @param scope
	 */
    oauth2(scope, appId) {
        const url = this.getShareURL(scope, appId);
        location.href = url;
    };

	/**
	 * 获取分享页的url
	 */
    getShareURL(scope, appId) {
        const redirect_uri = SessionStorage.getItem('redirect_uri');
        const params = {
            redirect_uri: redirect_uri,
            appId: appId,
            scope: scope
        };
        return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${params.appId}&
        redirect_uri=${params.redirect_uri}&response_type=code&scope=${params.scope}&state=cambio#wechat_redirect`;
    };

    postUserImgContent(openId, contentBean, appId, appSecret) {
        const bean = {
            'touser': openId,
            'msgtype': 'news',
            'news': {
                'articles': [
                    // {
                    //     'title':'Happy Day',
                    //     'description':'Is Really A Happy Day',
                    //     'url':'URL',
                    //     'picurl':'PIC_URL'
                    // }
                    contentBean
                ]
            },
            appId: appId,
            appSecret: appSecret
        };
        this.weChatResource.messageCustomSend(bean);
    }

}
